const axios = require('axios');

// 配置基础URL
const BASE_URL = 'http://localhost:3001';

// 测试数据
const testUser = {
  phone: '13800138000',
  password: '123456'
};

const testProduct = {
  proid: 'pro_36d07f55-68c3-4891-8c77-3c349c44d1be' // 真实存在的商品ID
};

let userToken = '';

// 工具函数：发送HTTP请求
async function makeRequest(method, url, data = {}, headers = {}) {
  try {
    const config = {
      method,
      url: `${BASE_URL}${url}`,
      headers: {
        'Content-Type': 'application/json',
        ...headers
      }
    };
    
    if (method.toLowerCase() !== 'get') {
      config.data = data;
    }
    
    const response = await axios(config);
    return response.data;
  } catch (error) {
    console.error(`请求失败: ${method} ${url}`, error.response?.data || error.message);
    return { code: 'ERROR', message: error.message };
  }
}

// 测试用例1：用户登录获取token
async function testUserLogin() {
  console.log('\n=== 测试1: 用户登录 ===');
  
  const result = await makeRequest('POST', '/api/user/login', testUser);
  
  if (result.code === '200' && result.data && result.data.token) {
    userToken = result.data.token;
    console.log('✅ 登录成功，获取到token');
    console.log('Token:', userToken.substring(0, 20) + '...');
    return true;
  } else {
    console.log('❌ 登录失败:', result.message);
    return false;
  }
}

// 测试用例2：添加商品到收藏夹
async function testAddFavorite() {
  console.log('\n=== 测试2: 添加收藏 ===');
  
  if (!userToken) {
    console.log('❌ 无token，跳过测试');
    return false;
  }
  
  const result = await makeRequest('POST', '/api/favorite/add', 
    { proid: testProduct.proid },
    { token: userToken }
  );
  
  if (result.code === '200') {
    console.log('✅ 添加收藏成功:', result.message);
    return true;
  } else if (result.code === '10103') {
    console.log('⚠️ 商品已收藏:', result.message);
    return true; // 已收藏也算正常
  } else {
    console.log('❌ 添加收藏失败:', result.message);
    return false;
  }
}

// 测试用例3：获取用户收藏列表
async function testGetFavoriteList() {
  console.log('\n=== 测试3: 获取收藏列表 ===');
  
  if (!userToken) {
    console.log('❌ 无token，跳过测试');
    return false;
  }
  
  const result = await makeRequest('POST', '/api/favorite/list', 
    {},
    { token: userToken }
  );
  
  if (result.code === '200') {
    console.log('✅ 获取收藏列表成功:', result.message);
    console.log('收藏数量:', result.data ? result.data.length : 0);
    if (result.data && result.data.length > 0) {
      console.log('收藏商品示例:', {
        proid: result.data[0].proid,
        proname: result.data[0].proname,
        createtime: result.data[0].createtime
      });
    }
    return true;
  } else {
    console.log('❌ 获取收藏列表失败:', result.message);
    return false;
  }
}

// 测试用例4：删除收藏
async function testRemoveFavorite() {
  console.log('\n=== 测试4: 删除收藏 ===');
  
  if (!userToken) {
    console.log('❌ 无token，跳过测试');
    return false;
  }
  
  const result = await makeRequest('POST', '/api/favorite/remove', 
    { proid: testProduct.proid },
    { token: userToken }
  );
  
  if (result.code === '200') {
    console.log('✅ 删除收藏成功:', result.message);
    return true;
  } else {
    console.log('❌ 删除收藏失败:', result.message);
    return false;
  }
}

// 测试用例5：验证删除后收藏列表
async function testFavoriteListAfterRemove() {
  console.log('\n=== 测试5: 验证删除后的收藏列表 ===');
  
  if (!userToken) {
    console.log('❌ 无token，跳过测试');
    return false;
  }
  
  const result = await makeRequest('POST', '/api/favorite/list', 
    {},
    { token: userToken }
  );
  
  if (result.code === '200') {
    const hasTargetProduct = result.data && result.data.some(item => item.proid === testProduct.proid);
    if (!hasTargetProduct) {
      console.log('✅ 验证成功: 商品已从收藏列表中移除');
      return true;
    } else {
      console.log('❌ 验证失败: 商品仍在收藏列表中');
      return false;
    }
  } else {
    console.log('❌ 获取收藏列表失败:', result.message);
    return false;
  }
}

// 测试用例6：边界情况测试
async function testEdgeCases() {
  console.log('\n=== 测试6: 边界情况测试 ===');
  
  let passCount = 0;
  let totalTests = 0;
  
  // 测试无token访问
  totalTests++;
  console.log('\n6.1 测试无token访问收藏接口');
  const noTokenResult = await makeRequest('POST', '/api/favorite/list', {});
  if (noTokenResult.code !== '200') {
    console.log('✅ 无token访问被正确拒绝');
    passCount++;
  } else {
    console.log('❌ 无token访问应该被拒绝');
  }
  
  // 测试空商品ID
  totalTests++;
  console.log('\n6.2 测试空商品ID添加收藏');
  const emptyProIdResult = await makeRequest('POST', '/api/favorite/add', 
    { proid: '' },
    { token: userToken }
  );
  if (emptyProIdResult.code === '10101') {
    console.log('✅ 空商品ID被正确拒绝');
    passCount++;
  } else {
    console.log('❌ 空商品ID应该被拒绝');
  }
  
  // 测试不存在的商品ID
  totalTests++;
  console.log('\n6.3 测试不存在的商品ID');
  const invalidProIdResult = await makeRequest('POST', '/api/favorite/add', 
    { proid: 'nonexistent_product_id_12345' },
    { token: userToken }
  );
  if (invalidProIdResult.code === '10102') {
    console.log('✅ 不存在的商品ID被正确拒绝');
    passCount++;
  } else {
    console.log('❌ 不存在的商品ID应该被拒绝');
  }
  
  console.log(`\n边界情况测试结果: ${passCount}/${totalTests} 通过`);
  return passCount === totalTests;
}

// 主测试函数
async function runFavoriteTests() {
  console.log('🚀 开始收藏接口测试...');
  console.log('测试服务器:', BASE_URL);
  
  const results = [];
  
  // 执行所有测试
  results.push(await testUserLogin());
  results.push(await testAddFavorite());
  results.push(await testGetFavoriteList());
  results.push(await testRemoveFavorite());
  results.push(await testFavoriteListAfterRemove());
  results.push(await testEdgeCases());
  
  // 统计结果
  const passCount = results.filter(result => result === true).length;
  const totalCount = results.length;
  
  console.log('\n' + '='.repeat(50));
  console.log('📊 测试结果汇总:');
  console.log(`总测试数: ${totalCount}`);
  console.log(`通过数: ${passCount}`);
  console.log(`失败数: ${totalCount - passCount}`);
  console.log(`通过率: ${((passCount / totalCount) * 100).toFixed(1)}%`);
  
  if (passCount === totalCount) {
    console.log('🎉 所有测试通过！收藏接口功能正常');
  } else {
    console.log('⚠️ 部分测试失败，请检查接口实现');
  }
  
  console.log('='.repeat(50));
}

// 运行测试
if (require.main === module) {
  runFavoriteTests().catch(console.error);
}

module.exports = { runFavoriteTests };